package Interfaz;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.TitledBorder;

public class PanelOperaciones extends JPanel implements ActionListener{
	
	// -----------------------------------------------------------------
    // Constantes
    // -----------------------------------------------------------------
    /**
     * El comando para el botón Ingresar
     */
    public static final String INGRESAR = "Ingresar";

    /**
     * El comando para el botón Delete
     */
    public static final String DELETE = "Delete";
    
    /**
     * El comando para el botón Calcular
     */
    public static final String CALCULAR = "Calcular";
    
    /**
     * El comando para el botón Ayuda
     */
    public static final String AYUDA = "Ayuda";
    
    /**
     * Representa los botones numéricos
     */
    //public static final String BOTON[] = {"UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS",
    	//"SIETE", "OCHO", "NUEVE", "CERO" };
    
    public static final String BOTON[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    
    /**
     * Representa los botones operador 
     */
    public static final String OPERADOR[] = {"+", "-", "*", "/"};
    
	// -----------------------------------------------------------------
    // Atributos
    // -----------------------------------------------------------------
    
    private boolean numero;
    
	// -----------------------------------------------------------------
    // Atributos de interfaz
    // -----------------------------------------------------------------
	
    
    private JButton botonIngresar;
    
    private JButton botonDelete;
    
    private JButton botonCalcular;
    
    private JButton botonAyuda;
    
    private JTextArea ingreso;
    
    private JScrollPane barraIng;
    
    private JTextArea respuesta;
    
    private JScrollPane barra;
    
    private JButton botonUno;
    
    private JButton botonDos;
    
    private JButton botonTres;
    
    private JButton botonCuatro;
    
    private JButton botonCinco;
    
    private JButton botonSeis;
    
    private JButton botonSiete;
    
    private JButton botonOcho;
    
    private JButton botonNueve;
    
    private JButton botonCero;
    
    private JButton botonSuma;
    
    private JButton botonResta;
    
    private JButton botonMulti;
    
    private JButton botonDiv;
    
    // -----------------------------------------------------------------
    // Atributos
    // -----------------------------------------------------------------
    
	/**
     * Ventana principal
     */
    private InterfazPrincipal principal;
	
	// -----------------------------------------------------------------
    // Constructores
    // -----------------------------------------------------------------
	
    public PanelOperaciones (InterfazPrincipal p)
    { 
        principal = p;
        numero = false;
    	
        setBorder( new TitledBorder( "Operación" ) );
        setLayout( new GridBagLayout( ) );

        //Boton Ingresar
        botonIngresar = new JButton( "Enter" );
        botonIngresar.setActionCommand( INGRESAR );
        botonIngresar.addActionListener( this );
        botonIngresar.setEnabled(true);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 5;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonIngresar, gbc);

      //Boton Delete
        botonDelete = new JButton( "Delete" );
        botonDelete.setActionCommand( DELETE );
        botonDelete.addActionListener( this );
        botonDelete.setEnabled(true);
        gbc.gridx = 5;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonDelete, gbc);
        
        //Boton Calcular
        botonCalcular = new JButton( "Respuesta" );
        botonCalcular.setActionCommand( CALCULAR );
        botonCalcular.addActionListener( this );
        botonCalcular.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 5;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonCalcular, gbc);
       
      //Boton Ayuda
        botonAyuda = new JButton( "Ayuda" );
        botonAyuda.setActionCommand( AYUDA );
        botonAyuda.addActionListener( this );
        botonAyuda.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 4;
        gbc.gridy = 5;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonAyuda, gbc);
        
        //Cuadro que despliega lo que se ingresa
        ingreso = new JTextArea( );
        ingreso.setLineWrap( true );
        ingreso.setWrapStyleWord( true );
        ingreso.setEditable(false);
        barraIng = new JScrollPane( ingreso );
        barraIng.setPreferredSize( new Dimension( 100, 100 ) );
        gbc = new GridBagConstraints( );
        gbc.gridx = 4;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(barraIng, gbc);
        
        // Cuadro en que se despliega la respuesta
        respuesta = new JTextArea( );
        respuesta.setLineWrap( true );
        respuesta.setWrapStyleWord( true );
        respuesta.setEditable(false);
        barra = new JScrollPane( respuesta );
        barra.setPreferredSize( new Dimension( 60, 20 ) );
        gbc = new GridBagConstraints( );
        gbc.gridx = 5;
        gbc.gridy = 4;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(barra, gbc);
        
      //Botones
        botonUno = new JButton( "1" );
        botonUno.setActionCommand( BOTON[0] );
        botonUno.addActionListener( this );
        botonUno.setEnabled(true);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonUno, gbc);
        
        botonDos = new JButton( "2" );
        botonDos.setActionCommand( BOTON[1] );
        botonDos.addActionListener( this );
        botonDos.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonDos, gbc);
        
        botonTres = new JButton( "3" );
        botonTres.setActionCommand( BOTON[2] );
        botonTres.addActionListener( this );
        botonTres.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 2;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonTres, gbc);
        
        botonCuatro = new JButton( "4" );
        botonCuatro.setActionCommand( BOTON[3] );
        botonCuatro.addActionListener( this );
        botonCuatro.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonCuatro, gbc);
        
        botonCinco = new JButton( "5" );
        botonCinco.setActionCommand( BOTON[4] );
        botonCinco.addActionListener( this );
        botonCinco.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonCinco, gbc);
        
        botonSeis = new JButton( "6" );
        botonSeis.setActionCommand( BOTON[5] );
        botonSeis.addActionListener( this );
        botonSeis.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 2;
        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonSeis, gbc);
        
        botonSiete = new JButton( "7" );
        botonSiete.setActionCommand( BOTON[6] );
        botonSiete.addActionListener( this );
        botonSiete.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonSiete, gbc);
        
        botonOcho = new JButton( "8" );
        botonOcho.setActionCommand( BOTON[7] );
        botonOcho.addActionListener( this );
        botonOcho.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 1;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonOcho, gbc);
        
        botonNueve = new JButton( "9" );
        botonNueve.setActionCommand( BOTON[8] );
        botonNueve.addActionListener( this );
        botonNueve.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 2;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonNueve, gbc);
        
        botonCero = new JButton( "0" );
        botonCero.setActionCommand( BOTON[9] );
        botonCero.addActionListener( this );
        botonCero.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonCero, gbc);
        
        botonSuma = new JButton( "+" );
        botonSuma.setActionCommand( OPERADOR[0] );
        botonSuma.addActionListener( this );
        botonSuma.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 1;
        gbc.gridy = 4;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonSuma, gbc);
        
        botonResta = new JButton( "-" );
        botonResta.setActionCommand( OPERADOR[1] );
        botonResta.addActionListener( this );
        botonResta.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 2;
        gbc.gridy = 4;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonResta, gbc);
        
        botonMulti = new JButton( "*" );
        botonMulti.setActionCommand( OPERADOR[2] );
        botonMulti.addActionListener( this );
        botonMulti.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 0;
        gbc.gridy = 5;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonMulti, gbc);
        
        botonDiv = new JButton( "/" );
        botonDiv.setActionCommand( OPERADOR[3] );
        botonDiv.addActionListener( this );
        botonDiv.setEnabled(true);
        gbc = new GridBagConstraints( );
        gbc.gridx = 1;
        gbc.gridy = 5;
        gbc.fill = GridBagConstraints.BOTH;
        add( botonDiv, gbc);
    }
    
    // -----------------------------------------------------------------
    // M�todos
    // -----------------------------------------------------------------
    
    public boolean esNumero()
    {
    	return numero;
    }
    
    public void actionPerformed( ActionEvent e )
    {
        String comando = e.getActionCommand( );

        	
        if( comando.equals( INGRESAR ) )
        {	
        	if (!ingreso.getText().isEmpty())
        	{
        		Object elemento = ingreso.getText();
        	
        		if (numero)
        			elemento = Integer.parseInt(ingreso.getText());

        		principal.ingresar(elemento, numero);
        		ingreso.setText(null);
        	}
        	
        	else
        		JOptionPane.showMessageDialog(this, "No hay ningún elemento ingresado.","Ayuda", JOptionPane.PLAIN_MESSAGE);
        }
        
        else if( comando.equals( CALCULAR ) )
        {
        	if (principal.isEmpty() == false)
        	{
        		int resp = principal.calcular();
        		respuesta.setText("" + resp);
        	}
        	
        	else
        	{
        		JOptionPane.showMessageDialog(this, "No hay ninguna expresión que calcular.","Ayuda", JOptionPane.PLAIN_MESSAGE);
        		respuesta.setText(null);
        	}
        }
        
        else if( comando.equals( AYUDA ) )
        {
        	principal.ayuda();
        }
        
        else if ( comando.equals( DELETE) )
        {
        	if(!ingreso.getText().isEmpty())
			{
        		int index = ingreso.getText().length()-1;
        		String actual = ingreso.getText().substring(0, index);   		
        		ingreso.setText(actual);
			}
        }

       	for (int i = 0; i < BOTON.length; i++)
   		{
   			if( comando.equals(BOTON[i]))
   			{
   				if(ingreso.getText().isEmpty())
   				{
   					ingreso.setText(BOTON[i]);
   					numero = true;
   				}
   				
   				else if(!ingreso.getText().isEmpty() && numero)
   				{
   					String actual = ingreso.getText();
   					ingreso.setText(actual+BOTON[i]);
   				}
   				
   				else
   				{
   					String[] opciones = {"Sí" , "No"};
   					int opcion = JOptionPane.showOptionDialog( this, "Está seguro que desea cambiar el valor u operador?", "Advertencia", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, opciones, null);
   					
   					if(opcion == 0)
   					{
   						ingreso.setText(BOTON[i]);
   						numero = true;
   					}
   				}
   			}
   		}
       	
       	for (int i = 0; i < OPERADOR.length; i++)
   		{
   			if( comando.equals(OPERADOR[i]))
   			{
   				if(ingreso.getText().isEmpty() && !principal.isEmpty())
   				{
   					ingreso.setText(OPERADOR[i]);
   					numero = false;
   				}
   					
   				else if(principal.isEmpty() || principal.tamano() <= 2)
   				{
   					JOptionPane.showMessageDialog(this, "Debe ingresar por lo menos dos operandos antes de ingresar un operador.","", JOptionPane.PLAIN_MESSAGE);
   				}
   					
   				else	
   				{
   					String[] opciones = {"Sí" , "No"};
   					int opcion = JOptionPane.showOptionDialog( this, "Está seguro que desea cambiar el valor u operador?", "Advertencia", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, opciones, null);
   					
   					if(opcion == 0)
   					{
   						ingreso.setText(OPERADOR[i]);
   						numero = false;
   					}
   				}
   			}
   		}
      }
}